import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:hive_flutter/hive_flutter.dart';

import 'core/router/app_router.dart';
import 'core/providers/theme_provider.dart';
import 'core/providers/error_handler_provider.dart';
import 'core/providers/user_extra_info_provider.dart';
import 'core/providers/auth_provider.dart';
import 'core/api/api_client.dart';
import 'core/utils/log_filter.dart';

// import 'core/providers/auth_provider.dart';
import 'package:responsive_framework/responsive_framework.dart';
// import 'package:workmanager/workmanager.dart';  // 暂时注释掉

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化日志过滤器，过滤EGL相关日志
  LogFilter.init();

  // 初始化本地存储
  await Hive.initFlutter();
  await Hive.openBox('app');
  // 初始化 WorkManager（Android 后台任务）
  // try {
  //   await Workmanager().initialize(
  //     _backgroundTaskDispatcher,
  //     isInDebugMode: false,
  //   );
  // } catch (_) {}

  // 初始化网络客户端
  final apiClient = ApiClient();
  apiClient.init();

  // 设置401错误回调
  apiClient.setUnauthorizedCallback(() {
    // 这里可以通过全局状态管理来处理401错误
    print('🔄 401错误回调被触发');
  });

  // 应用启动时尝试恢复本地 token
  try {
    final box = Hive.box('app');
    final savedToken = box.get('accessToken');
    if (savedToken is String && savedToken.isNotEmpty) {
      apiClient.setAuthToken(savedToken);
      print('🔁 已从本地恢复Token');
    }

    // 检查本地用户额外信息
    final userExtraInfo = box.get('userExtraInfo');
    if (userExtraInfo != null) {
      print('📱 本地已有用户额外信息，应用启动时无需请求API');
    }
  } catch (_) {}

  runApp(const ProviderScope(child: MyApp()));
}

// 后台任务分发器（Android）
// @pragma('vm:entry-point')
// void _backgroundTaskDispatcher() {
//   Workmanager().executeTask((task, inputData) async {
//     // 这里可做：定时刷新token、同步进度、预取数据等
//     // 简单示例：打印日志并返回成功
//     debugPrint('⏰ Background task: $task, data: $inputData');
//     return Future.value(true);
//   });
// }

class MyApp extends ConsumerWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final GoRouter router = ref.watch(goRouterProvider);
    final theme = ref.watch(themeDataProvider);
    ref.watch(errorHandlerProvider);

    // 设置provider之间的引用关系
    final authNotifier = ref.read(authProvider.notifier);
    final userExtraInfoNotifier = ref.read(userExtraInfoProvider.notifier);
    final themeNotifier = ref.read(themeStageProvider.notifier);

    // 设置用户额外信息提供者引用
    authNotifier.setUserExtraInfoNotifier(userExtraInfoNotifier);
    // 设置主题提供者引用
    userExtraInfoNotifier.setThemeNotifier(themeNotifier);

    // 监听401错误状态
    ref.listen<ErrorHandlerState>(errorHandlerProvider, (previous, next) {
      if (next.hasUnauthorizedError && !previous!.hasUnauthorizedError) {
        // 跳转到401错误页面
        router.go('/unauthorized');
      }
    });

    return MaterialApp.router(
      title: 'AISelfPrac',
      theme: theme,
      routerConfig: router,
      debugShowCheckedModeBanner: false,
      builder: (context, child) {
        // 基于设备宽度的全局缩放：按设计宽度390计算缩放因子
        const double designWidth = 390.0;
        final double deviceWidth = MediaQuery.of(context).size.width;
        final double scaleFactor = (deviceWidth / designWidth).clamp(
          0.85,
          1.25,
        );

        // 只对图标进行缩放，字体大小由主题控制
        final ThemeData scaledTheme = theme.copyWith(
          iconTheme: theme.iconTheme.copyWith(
            size:
                theme.iconTheme.size == null
                    ? null
                    : theme.iconTheme.size! * scaleFactor,
          ),
          primaryIconTheme: theme.primaryIconTheme.copyWith(
            size:
                theme.primaryIconTheme.size == null
                    ? null
                    : theme.primaryIconTheme.size! * scaleFactor,
          ),
        );

        return MediaQuery(
          data: MediaQuery.of(
            context,
          ).copyWith(textScaler: TextScaler.linear(scaleFactor)),
          child: Theme(
            data: scaledTheme,
            child: BouncingScrollWrapper.builder(context, child!),
          ),
        );
      },
    );
  }
}
